using Baci.Net.ToolKit.ArcGISProGeoprocessor.Models;
using Baci.Net.ToolKit.ArcGISProGeoprocessor.Models.Attributes;
using Baci.Net.ToolKit.ArcGISProGeoprocessor.Models.Attributes.DomainAttributes;
using Baci.Net.ToolKit.ArcGISProGeoprocessor.Models.Enums;
using System.Collections.Generic;
using System.ComponentModel;

namespace Baci.ArcGIS._DataManagementTools._Raster._OrthoMapping
{
    /// <summary>
    /// <para>Interpolate From Point Cloud</para>
    /// <para>Interpolates a digital terrain model (DTM) or a digital surface model (DSM) from a point cloud using one of the interpolation methods provided.</para>
    /// <para>使用提供的插值方法之一从点云插值数字地形模型 （DTM） 或数字表面模型 （DSM）。</para>
    /// </summary>    
    [DisplayName("Interpolate From Point Cloud")]
    public class InterpolateFromPointCloud : AbstractGPProcess
    {
        /// <summary>
        /// 无参构造
        /// </summary>
        public InterpolateFromPointCloud()
        {

        }

        /// <summary>
        /// 有参构造
        /// </summary>
        /// <param name="_in_container">
        /// <para>Input LAS Folder or Point Table</para>
        /// <para><xdoc>
        ///   <para>The path and name of the file, folder, or feature layer. The input can be a folder of LAS files or a solution point table from orthomapping tools.</para>
        ///   <para>The LAS files can be the output from the Generate Point Cloud tool, in which LAS points are categorized as ground and above ground. The solution point table is output from either the Compute Block Adjustments tool or the Compute Camera Model tool.</para>
        /// </xdoc></para>
        /// <para><xdoc>
        ///   <para>文件、文件夹或要素图层的路径和名称。输入可以是 LAS 文件的文件夹，也可以是正射映射工具中的求解点表。</para>
        ///   <para>LAS 文件可以是生成点云工具的输出，其中 LAS 点分为地面和地上。求解点表可从计算块平差工具或计算相机模型工具输出。</para>
        /// </xdoc></para>
        /// </param>
        /// <param name="_out_raster">
        /// <para>Output Raster</para>
        /// <para><xdoc>
        ///   <para>The output raster dataset location, name, and file extension.</para>
        ///   <para>The output can be created in most writable raster formats, such as .tif, .crf, or .img.</para>
        /// </xdoc></para>
        /// <para><xdoc>
        ///   <para>输出栅格数据集位置、名称和文件扩展名。</para>
        ///   <para>输出可以创建为大多数可写栅格格式，例如 .tif、.crf 或 .img。</para>
        /// </xdoc></para>
        /// </param>
        /// <param name="_cell_size">
        /// <para>Cellsize</para>
        /// <para>The cell size of the output raster dataset.</para>
        /// <para>输出栅格数据集的像元大小。</para>
        /// </param>
        /// <param name="_interpolation_method">
        /// <para>Interpolation Method</para>
        /// <para><xdoc>
        ///   <para>Specifies the method used to interpolate the output raster dataset from the point cloud.</para>
        ///   <bulletList>
        ///     <bullet_item>TIN linear interpolation— This is also known as triangulated irregular network (TIN) linear interpolation and is designed for irregularly distributed sparse points, such as solution points from block adjustment computation.</bullet_item><para/>
        ///     <bullet_item>TIN natural neighbor interpolation—This is similar to triangulation but generates a smoother surface and is more computationally intensive.</bullet_item><para/>
        ///     <bullet_item>Inverse distance weighted average interpolation—This is used for regularly distributed dense points, such as point cloud LAS files from the Generate Point Cloud tool. The IDW search radius is automatically computed based on average point density.</bullet_item><para/>
        ///   </bulletList>
        /// </xdoc></para>
        /// <para><xdoc>
        ///   <para>指定用于从点云插值输出栅格数据集的方法。</para>
        ///   <bulletList>
        ///     <bullet_item>TIN 线性插值— 也称为三角不规则网络 （TIN） 线性插值，专为不规则分布的稀疏点而设计，例如块平差计算中的求解点。</bullet_item><para/>
        ///     <bullet_item>TIN 自然邻域插值 - 这类似于三角测量，但生成更平滑的曲面，并且计算量更大。</bullet_item><para/>
        ///     <bullet_item>反距离加权平均插值 - 用于规则分布的密集点，例如生成点云工具中的点云 LAS 文件。IDW 搜索半径是根据平均点密度自动计算的。</bullet_item><para/>
        ///   </bulletList>
        /// </xdoc></para>
        /// </param>
        /// <param name="_smooth_method">
        /// <para>Smoothing Method</para>
        /// <para><xdoc>
        ///   <para>Specifies the filter to smooth the output raster dataset.</para>
        ///   <bulletList>
        ///     <bullet_item>Gaussian 3 by 3—A Gaussian filter with a 3 by 3 window will be used.</bullet_item><para/>
        ///     <bullet_item>Gaussian 5 by 5—A Gaussian filter with a 5 by 5 window will be used.</bullet_item><para/>
        ///     <bullet_item>Gaussian 7 by 7—A Gaussian filter with a 7 by 7 window will be used.</bullet_item><para/>
        ///     <bullet_item>Gaussian 9 by 9—A Gaussian filter with a 9 by 9 window will be used.</bullet_item><para/>
        ///     <bullet_item>No smoothing—No smoothing filter will be used.</bullet_item><para/>
        ///   </bulletList>
        /// </xdoc></para>
        /// <para><xdoc>
        ///   <para>指定用于平滑输出栅格数据集的过滤器。</para>
        ///   <bulletList>
        ///     <bullet_item>高斯 3 x 3—将使用具有 3 x 3 窗口的高斯滤波器。</bullet_item><para/>
        ///     <bullet_item>高斯 5 x 5—将使用具有 5 x 5 窗口的高斯滤波器。</bullet_item><para/>
        ///     <bullet_item>高斯 7 x 7—将使用具有 7 x 7 窗口的高斯滤波器。</bullet_item><para/>
        ///     <bullet_item>高斯 9 x 9—将使用具有 9 x 9 窗口的高斯滤波器。</bullet_item><para/>
        ///     <bullet_item>无平滑—不使用平滑过滤器。</bullet_item><para/>
        ///   </bulletList>
        /// </xdoc></para>
        /// </param>
        public InterpolateFromPointCloud(object _in_container, object _out_raster, double? _cell_size, _interpolation_method_value _interpolation_method, _smooth_method_value _smooth_method)
        {
            this._in_container = _in_container;
            this._out_raster = _out_raster;
            this._cell_size = _cell_size;
            this._interpolation_method = _interpolation_method;
            this._smooth_method = _smooth_method;
        }
        public override string ToolboxName => "Data Management Tools";

        public override string ToolName => "Interpolate From Point Cloud";

        public override string CallName => "management.InterpolateFromPointCloud";

        public override List<string> AcceptEnvironments => ["cellAlignment", "extent", "geographicTransformations", "outputCoordinateSystem", "parallelProcessingFactor", "pyramid", "scratchWorkspace", "workspace"];

        public override object[] ParameterInfo => [_in_container, _out_raster, _cell_size, _interpolation_method.GetGPValue(), _smooth_method.GetGPValue(), _surface_type.GetGPValue(), _fill_dem];

        /// <summary>
        /// <para>Input LAS Folder or Point Table</para>
        /// <para><xdoc>
        ///   <para>The path and name of the file, folder, or feature layer. The input can be a folder of LAS files or a solution point table from orthomapping tools.</para>
        ///   <para>The LAS files can be the output from the Generate Point Cloud tool, in which LAS points are categorized as ground and above ground. The solution point table is output from either the Compute Block Adjustments tool or the Compute Camera Model tool.</para>
        /// </xdoc></para>
        /// <para><xdoc>
        ///   <para>文件、文件夹或要素图层的路径和名称。输入可以是 LAS 文件的文件夹，也可以是正射映射工具中的求解点表。</para>
        ///   <para>LAS 文件可以是生成点云工具的输出，其中 LAS 点分为地面和地上。求解点表可从计算块平差工具或计算相机模型工具输出。</para>
        /// </xdoc></para>
        /// <para></para>
        /// </summary>
        [DisplayName("Input LAS Folder or Point Table")]
        [Description("")]
        [Option(OptionTypeEnum.Must)]
        public object _in_container { get; set; }


        /// <summary>
        /// <para>Output Raster</para>
        /// <para><xdoc>
        ///   <para>The output raster dataset location, name, and file extension.</para>
        ///   <para>The output can be created in most writable raster formats, such as .tif, .crf, or .img.</para>
        /// </xdoc></para>
        /// <para><xdoc>
        ///   <para>输出栅格数据集位置、名称和文件扩展名。</para>
        ///   <para>输出可以创建为大多数可写栅格格式，例如 .tif、.crf 或 .img。</para>
        /// </xdoc></para>
        /// <para></para>
        /// </summary>
        [DisplayName("Output Raster")]
        [Description("")]
        [Option(OptionTypeEnum.Must)]
        public object _out_raster { get; set; }


        /// <summary>
        /// <para>Cellsize</para>
        /// <para>The cell size of the output raster dataset.</para>
        /// <para>输出栅格数据集的像元大小。</para>
        /// <para></para>
        /// </summary>
        [DisplayName("Cellsize")]
        [Description("")]
        [Option(OptionTypeEnum.Must)]
        public double? _cell_size { get; set; }


        /// <summary>
        /// <para>Interpolation Method</para>
        /// <para><xdoc>
        ///   <para>Specifies the method used to interpolate the output raster dataset from the point cloud.</para>
        ///   <bulletList>
        ///     <bullet_item>TIN linear interpolation— This is also known as triangulated irregular network (TIN) linear interpolation and is designed for irregularly distributed sparse points, such as solution points from block adjustment computation.</bullet_item><para/>
        ///     <bullet_item>TIN natural neighbor interpolation—This is similar to triangulation but generates a smoother surface and is more computationally intensive.</bullet_item><para/>
        ///     <bullet_item>Inverse distance weighted average interpolation—This is used for regularly distributed dense points, such as point cloud LAS files from the Generate Point Cloud tool. The IDW search radius is automatically computed based on average point density.</bullet_item><para/>
        ///   </bulletList>
        /// </xdoc></para>
        /// <para><xdoc>
        ///   <para>指定用于从点云插值输出栅格数据集的方法。</para>
        ///   <bulletList>
        ///     <bullet_item>TIN 线性插值— 也称为三角不规则网络 （TIN） 线性插值，专为不规则分布的稀疏点而设计，例如块平差计算中的求解点。</bullet_item><para/>
        ///     <bullet_item>TIN 自然邻域插值 - 这类似于三角测量，但生成更平滑的曲面，并且计算量更大。</bullet_item><para/>
        ///     <bullet_item>反距离加权平均插值 - 用于规则分布的密集点，例如生成点云工具中的点云 LAS 文件。IDW 搜索半径是根据平均点密度自动计算的。</bullet_item><para/>
        ///   </bulletList>
        /// </xdoc></para>
        /// <para></para>
        /// </summary>
        [DisplayName("Interpolation Method")]
        [Description("")]
        [Option(OptionTypeEnum.Must)]
        public _interpolation_method_value _interpolation_method { get; set; }

        public enum _interpolation_method_value
        {
            /// <summary>
            /// <para>TIN linear interpolation</para>
            /// <para>TIN linear interpolation— This is also known as triangulated irregular network (TIN) linear interpolation and is designed for irregularly distributed sparse points, such as solution points from block adjustment computation.</para>
            /// <para>TIN 线性插值— 也称为三角不规则网络 （TIN） 线性插值，专为不规则分布的稀疏点而设计，例如块平差计算中的求解点。</para>
            /// </summary>
            [Description("TIN linear interpolation")]
            [GPEnumValue("TRIANGULATION")]
            _TRIANGULATION,

            /// <summary>
            /// <para>TIN natural neighbor interpolation</para>
            /// <para>TIN natural neighbor interpolation—This is similar to triangulation but generates a smoother surface and is more computationally intensive.</para>
            /// <para>TIN 自然邻域插值 - 这类似于三角测量，但生成更平滑的曲面，并且计算量更大。</para>
            /// </summary>
            [Description("TIN natural neighbor interpolation")]
            [GPEnumValue("NATURAL_NEIGHBOR")]
            _NATURAL_NEIGHBOR,

            /// <summary>
            /// <para>Inverse distance weighted average interpolation</para>
            /// <para>Inverse distance weighted average interpolation—This is used for regularly distributed dense points, such as point cloud LAS files from the Generate Point Cloud tool. The IDW search radius is automatically computed based on average point density.</para>
            /// <para>反距离加权平均插值 - 用于规则分布的密集点，例如生成点云工具中的点云 LAS 文件。IDW 搜索半径是根据平均点密度自动计算的。</para>
            /// </summary>
            [Description("Inverse distance weighted average interpolation")]
            [GPEnumValue("IDW")]
            _IDW,

        }

        /// <summary>
        /// <para>Smoothing Method</para>
        /// <para><xdoc>
        ///   <para>Specifies the filter to smooth the output raster dataset.</para>
        ///   <bulletList>
        ///     <bullet_item>Gaussian 3 by 3—A Gaussian filter with a 3 by 3 window will be used.</bullet_item><para/>
        ///     <bullet_item>Gaussian 5 by 5—A Gaussian filter with a 5 by 5 window will be used.</bullet_item><para/>
        ///     <bullet_item>Gaussian 7 by 7—A Gaussian filter with a 7 by 7 window will be used.</bullet_item><para/>
        ///     <bullet_item>Gaussian 9 by 9—A Gaussian filter with a 9 by 9 window will be used.</bullet_item><para/>
        ///     <bullet_item>No smoothing—No smoothing filter will be used.</bullet_item><para/>
        ///   </bulletList>
        /// </xdoc></para>
        /// <para><xdoc>
        ///   <para>指定用于平滑输出栅格数据集的过滤器。</para>
        ///   <bulletList>
        ///     <bullet_item>高斯 3 x 3—将使用具有 3 x 3 窗口的高斯滤波器。</bullet_item><para/>
        ///     <bullet_item>高斯 5 x 5—将使用具有 5 x 5 窗口的高斯滤波器。</bullet_item><para/>
        ///     <bullet_item>高斯 7 x 7—将使用具有 7 x 7 窗口的高斯滤波器。</bullet_item><para/>
        ///     <bullet_item>高斯 9 x 9—将使用具有 9 x 9 窗口的高斯滤波器。</bullet_item><para/>
        ///     <bullet_item>无平滑—不使用平滑过滤器。</bullet_item><para/>
        ///   </bulletList>
        /// </xdoc></para>
        /// <para></para>
        /// </summary>
        [DisplayName("Smoothing Method")]
        [Description("")]
        [Option(OptionTypeEnum.Must)]
        public _smooth_method_value _smooth_method { get; set; }

        public enum _smooth_method_value
        {
            /// <summary>
            /// <para>Gaussian 3 by 3</para>
            /// <para>Gaussian 3 by 3—A Gaussian filter with a 3 by 3 window will be used.</para>
            /// <para>高斯 3 x 3—将使用具有 3 x 3 窗口的高斯滤波器。</para>
            /// </summary>
            [Description("Gaussian 3 by 3")]
            [GPEnumValue("GAUSS3x3")]
            _GAUSS3x3,

            /// <summary>
            /// <para>Gaussian 5 by 5</para>
            /// <para>Gaussian 5 by 5—A Gaussian filter with a 5 by 5 window will be used.</para>
            /// <para>高斯 5 x 5—将使用具有 5 x 5 窗口的高斯滤波器。</para>
            /// </summary>
            [Description("Gaussian 5 by 5")]
            [GPEnumValue("GAUSS5x5")]
            _GAUSS5x5,

            /// <summary>
            /// <para>Gaussian 7 by 7</para>
            /// <para>Gaussian 7 by 7—A Gaussian filter with a 7 by 7 window will be used.</para>
            /// <para>高斯 7 x 7—将使用具有 7 x 7 窗口的高斯滤波器。</para>
            /// </summary>
            [Description("Gaussian 7 by 7")]
            [GPEnumValue("GAUSS7x7")]
            _GAUSS7x7,

            /// <summary>
            /// <para>Gaussian 9 by 9</para>
            /// <para>Gaussian 9 by 9—A Gaussian filter with a 9 by 9 window will be used.</para>
            /// <para>高斯 9 x 9—将使用具有 9 x 9 窗口的高斯滤波器。</para>
            /// </summary>
            [Description("Gaussian 9 by 9")]
            [GPEnumValue("GAUSS9x9")]
            _GAUSS9x9,

            /// <summary>
            /// <para>No smoothing</para>
            /// <para>No smoothing—No smoothing filter will be used.</para>
            /// <para>无平滑—不使用平滑过滤器。</para>
            /// </summary>
            [Description("No smoothing")]
            [GPEnumValue("NONE")]
            _NONE,

        }

        /// <summary>
        /// <para>Surface Type</para>
        /// <para><xdoc>
        ///   <para>Specifies whether a digital terrain model or a digital surface model will be created.</para>
        ///   <bulletList>
        ///     <bullet_item>Digital terrain model—A digital terrain model will be created by interpolating only the ground points.</bullet_item><para/>
        ///     <bullet_item>Digital surface model—A digital surface model will be created by interpolating all the points.</bullet_item><para/>
        ///   </bulletList>
        /// </xdoc></para>
        /// <para><xdoc>
        ///   <para>指定是创建数字地形模型还是数字表面模型。</para>
        ///   <bulletList>
        ///     <bullet_item>数字地形模型—仅通过插值地面点来创建数字地形模型。</bullet_item><para/>
        ///     <bullet_item>数字曲面模型 - 将通过插值所有点来创建数字曲面模型。</bullet_item><para/>
        ///   </bulletList>
        /// </xdoc></para>
        /// <para></para>
        /// </summary>
        [DisplayName("Surface Type")]
        [Description("")]
        [Option(OptionTypeEnum.optional)]
        public _surface_type_value _surface_type { get; set; } = _surface_type_value._DTM;

        public enum _surface_type_value
        {
            /// <summary>
            /// <para>Digital terrain model</para>
            /// <para>Digital terrain model—A digital terrain model will be created by interpolating only the ground points.</para>
            /// <para>数字地形模型—仅通过插值地面点来创建数字地形模型。</para>
            /// </summary>
            [Description("Digital terrain model")]
            [GPEnumValue("DTM")]
            _DTM,

            /// <summary>
            /// <para>Digital surface model</para>
            /// <para>Digital surface model—A digital surface model will be created by interpolating all the points.</para>
            /// <para>数字曲面模型 - 将通过插值所有点来创建数字曲面模型。</para>
            /// </summary>
            [Description("Digital surface model")]
            [GPEnumValue("DSM")]
            _DSM,

        }

        /// <summary>
        /// <para>Input Fill DEM</para>
        /// <para>A DEM raster input that is used to fill NoData areas. Areas of NoData may exist where pixels do not have enough information from the input to generate any values.</para>
        /// <para>用于填充 NoData 区域的 DEM 栅格输入。在 NoData 中，像素可能没有足够的信息来自输入来生成任何值。</para>
        /// <para></para>
        /// </summary>
        [DisplayName("Input Fill DEM")]
        [Description("")]
        [Option(OptionTypeEnum.optional)]
        public object _fill_dem { get; set; } = null;


        public InterpolateFromPointCloud SetEnv(object extent = null, object geographicTransformations = null, object outputCoordinateSystem = null, object parallelProcessingFactor = null, object pyramid = null, object scratchWorkspace = null, object workspace = null)
        {
            base.SetEnv(extent: extent, geographicTransformations: geographicTransformations, outputCoordinateSystem: outputCoordinateSystem, parallelProcessingFactor: parallelProcessingFactor, pyramid: pyramid, scratchWorkspace: scratchWorkspace, workspace: workspace);
            return this;
        }

    }

}